package site.wanjiahao.stack;

import site.wanjiahao.list.ArrayList;

/**
 * 栈是一种线性结构，个动态数组链表都很相似，可以采用动态数组
 * 链表相对而言不适合，应该栈都是尾元素操作，采用双向链表倒是可以
 * 并且Stack不易于用继承的关系，如果继承就有父类的方法，可以采用聚合关系方式。符合合成复用原则
 *
 * 聚合：整体消失，部分任然成长
 * 组合：整体消息，部分消失
 * @param <E>
 */
public class Stack<E> {

    private final ArrayList<E> list = new ArrayList<>();

    public int size() {
        return list.size();
    }

    public boolean isEmpty() {
        return list.isEmpty();
    }

    public void push(E e) {
        list.add(e);
    }

    public E pop() {
        return list.remove(list.size() - 1);
    }

    public E peek() {
        return list.get(list.size() - 1);
    }

    public void clear() {
        list.clear();
    }
}
